We use data on players from the 2010 World Cup. The data frame contains 595 observations on the following variables:
Player |
Player’s last name |
Team |
Country |
Position |
a factor (levels: Defender, Forward, Goalkeeper, Midfielder) |
Time |
Time played in minutes |
Shots |
Number of shots attempted |
Passes |
Number of passes made |
Tackles |
Number of tackles made |
Saves |
Number of saves made |
Load the tidyverse package
library(tidyverse)
Get the data:
fifa_link <- "https://raw.githubusercontent.com/reisanar/datasets/master/worldcup.csv"
fifa10 <- read_csv(fifa_link)
Learn about the nature of the data
glimpse(fifa10)
Observations: 595
Variables: 8
$ Player [3m[90m<chr>[39m[23m "Abdoun", "Abe", "Abidal", "Abou Diaby", "Aboubakar", "Abreu", "Addy", "Adiyi…
$ Team [3m[90m<chr>[39m[23m "Algeria", "Japan", "France", "France", "Cameroon", "Uruguay", "Ghana", "Ghan…
$ Position [3m[90m<chr>[39m[23m "Midfielder", "Midfielder", "Defender", "Midfielder", "Forward", "Forward", "…
$ Time [3m[90m<dbl>[39m[23m 16, 351, 180, 270, 46, 72, 138, 33, 21, 103, 270, 55, 106, 270, 390, 90, 136,…
$ Shots [3m[90m<dbl>[39m[23m 0, 0, 0, 1, 2, 0, 0, 0, 5, 0, 2, 0, 2, 1, 1, 1, 5, 9, 0, 1, 0, 1, 7, 4, 1, 0,…
$ Passes [3m[90m<dbl>[39m[23m 6, 101, 91, 111, 16, 15, 51, 9, 22, 38, 120, 31, 57, 123, 172, 59, 42, 465, 3…
$ Tackles [3m[90m<dbl>[39m[23m 0, 14, 6, 5, 0, 0, 2, 0, 0, 1, 10, 2, 2, 11, 13, 7, 3, 18, 0, 1, 1, 0, 1, 11,…
$ Saves [3m[90m<dbl>[39m[23m 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
Scatterplot
To understand the relationship between the number of passes and the number of tackles, let us use a scatter plot with Tackles in the horizontal axis, and Passes in the vertical axis. Color the points by Position
ggplot(data = fifa10) +
geom_point(aes(x = Tackles, y = Passes, color = Position))

Challenge
- Do you notice anything in particular about those players in
Goalkeeper and Forward positions?
We can also check the relationship between the number of minutes played in the tournament (in the horizontal axis) and the number of passes completed by the player (in the vertical axis). Color the points by Position
ggplot(data = fifa10) +
geom_point(aes(x = Time, y = Passes, color = Position))

Challenge
- Do you notice any particular structure/pattern in the graph above?
fifa10 %>%
filter(Time > 400, Passes > 300, Position == 'Forward')
We can even add the variable Shots to the previous plot and plot the points based on the number of shots per player. Use the option size=Shots in the aesthetics.
ggplot(data = fifa10) +
geom_point(aes(x = Time, y = Passes,
color = Position, size = Shots),
alpha = 0.5)

Challenge
- Can you find the name of any outstanding players based on the graph above?
Interactive Plots with plotly
We can use the plotly to convert ggplot objects into interactive plots in a very easy way!
library(plotly)
Let us recreate one of the plots studied before:
my_fifa_plot <- ggplot(data = fifa10) +
geom_point(aes(x = Time, y = Passes, color = Position, size = Shots),
alpha = 0.5)
Using the ggplotly() function, we can add interactivity powered by plotly
ggplotly(my_fifa_plot)
Notice that the interactive plot is also available in the .html output generated from this notebook!
To get you started, other examples can be found below: https://www.r-graph-gallery.com/interactive-charts.html
LS0tCnRpdGxlOiAiSW50ZXJhY3RpY2UgVmlzdWFsaXphdGlvbiAtIEEgcXVpY2sgZXhhbXBsZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKV2UgdXNlIGRhdGEgb24gcGxheWVycyBmcm9tIHRoZSAyMDEwIFdvcmxkIEN1cC4gVGhlIGRhdGEgZnJhbWUgY29udGFpbnMgNTk1IG9ic2VydmF0aW9ucyBvbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKClZhcmlhYmxlICAgICAgfCBEZXNjcmlwdGlvbgotLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYFBsYXllcmAgICAgICB8IFBsYXllcidzIGxhc3QgbmFtZQpgVGVhbWAgICAgICAgIHwgQ291bnRyeQpgUG9zaXRpb25gICAgIHwgYSBmYWN0b3IgKGxldmVsczogYERlZmVuZGVyYCwgYEZvcndhcmRgLCBgR29hbGtlZXBlcmAsIGBNaWRmaWVsZGVyYCkKYFRpbWVgICAgICAgICB8IFRpbWUgcGxheWVkIGluIG1pbnV0ZXMKYFNob3RzYCAgICAgICB8IE51bWJlciBvZiBzaG90cyBhdHRlbXB0ZWQKYFBhc3Nlc2AgICAgICB8IE51bWJlciBvZiBwYXNzZXMgbWFkZQpgVGFja2xlc2AgICAgIHwgTnVtYmVyIG9mIHRhY2tsZXMgbWFkZQpgU2F2ZXNgICAgICAgIHwgTnVtYmVyIG9mIHNhdmVzIG1hZGUKCgpMb2FkIHRoZSBgdGlkeXZlcnNlYCBwYWNrYWdlCgpgYGB7ciwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKR2V0IHRoZSBkYXRhOgoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmZpZmFfbGluayA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JlaXNhbmFyL2RhdGFzZXRzL21hc3Rlci93b3JsZGN1cC5jc3YiCmZpZmExMCA8LSByZWFkX2NzdihmaWZhX2xpbmspCmBgYAoKTGVhcm4gYWJvdXQgdGhlIG5hdHVyZSBvZiB0aGUgZGF0YQoKYGBge3J9CmdsaW1wc2UoZmlmYTEwKQpgYGAKCgoKCgojIyBTY2F0dGVycGxvdAoKVG8gdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSBudW1iZXIgb2YgdGFja2xlcywgbGV0IHVzIHVzZSBhIF9zY2F0dGVyIHBsb3RfIHdpdGggYFRhY2tsZXNgIGluIHRoZSBob3Jpem9udGFsIGF4aXMsIGFuZCBgUGFzc2VzYCBpbiB0aGUgdmVydGljYWwgYXhpcy4gQ29sb3IgdGhlIHBvaW50cyBieSBgUG9zaXRpb25gCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBmaWZhMTApICsgCiAgZ2VvbV9wb2ludChhZXMoeCA9IFRhY2tsZXMsIHkgPSBQYXNzZXMsIGNvbG9yID0gUG9zaXRpb24pKQpgYGAKCioqQ2hhbGxlbmdlKioKCi0gRG8geW91IG5vdGljZSBhbnl0aGluZyBpbiBwYXJ0aWN1bGFyIGFib3V0IHRob3NlIHBsYXllcnMgaW4gYEdvYWxrZWVwZXJgIGFuZCBgRm9yd2FyZGAgcG9zaXRpb25zPwoKCgpXZSBjYW4gYWxzbyBjaGVjayB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiBtaW51dGVzIHBsYXllZCBpbiB0aGUgdG91cm5hbWVudCAoaW4gdGhlIGhvcml6b250YWwgYXhpcykgYW5kIHRoZSBudW1iZXIgb2YgcGFzc2VzIGNvbXBsZXRlZCBieSB0aGUgcGxheWVyIChpbiB0aGUgdmVydGljYWwgYXhpcykuIENvbG9yIHRoZSBwb2ludHMgYnkgYFBvc2l0aW9uYAoKYGBge3J9CmdncGxvdChkYXRhID0gZmlmYTEwKSArIAogIGdlb21fcG9pbnQoYWVzKHggPSBUaW1lLCB5ID0gUGFzc2VzLCBjb2xvciA9IFBvc2l0aW9uKSkKCmBgYAoKKipDaGFsbGVuZ2UqKgoKLSBEbyB5b3Ugbm90aWNlIGFueSBwYXJ0aWN1bGFyIF9zdHJ1Y3R1cmUvcGF0dGVybl8gaW4gdGhlIGdyYXBoIGFib3ZlPwoKYGBge3J9CmZpZmExMCAlPiUgCiAgZmlsdGVyKFRpbWUgPiA0MDAsIFBhc3NlcyA+IDMwMCwgUG9zaXRpb24gPT0gJ0ZvcndhcmQnKQpgYGAKCgoKV2UgY2FuIGV2ZW4gYWRkIHRoZSB2YXJpYWJsZSBgU2hvdHNgIHRvIHRoZSBwcmV2aW91cyBwbG90IGFuZCBwbG90IHRoZSBwb2ludHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBzaG90cyBwZXIgcGxheWVyLiBVc2UgdGhlIG9wdGlvbiBgc2l6ZT1TaG90c2AgaW4gdGhlIGFlc3RoZXRpY3MuIAoKYGBge3J9CmdncGxvdChkYXRhID0gZmlmYTEwKSArIAogIGdlb21fcG9pbnQoYWVzKHggPSBUaW1lLCB5ID0gUGFzc2VzLCAKICAgICAgICAgICAgICAgICBjb2xvciA9IFBvc2l0aW9uLCBzaXplID0gU2hvdHMpLCAKICAgICAgICAgICAgIGFscGhhID0gMC41KQoKYGBgCgoqKkNoYWxsZW5nZSoqCgotIENhbiB5b3UgZmluZCB0aGUgbmFtZSBvZiBhbnkgX291dHN0YW5kaW5nXyBwbGF5ZXJzIGJhc2VkIG9uIHRoZSBncmFwaCBhYm92ZT8gCgoKCgojIyBJbnRlcmFjdGl2ZSBQbG90cyB3aXRoIHBsb3RseQoKV2UgY2FuIHVzZSB0aGUgYHBsb3RseWAgdG8gY29udmVydCBgZ2dwbG90YCBvYmplY3RzIGludG8gaW50ZXJhY3RpdmUgcGxvdHMgaW4gYSB2ZXJ5IGVhc3kgd2F5IQoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkocGxvdGx5KQpgYGAKCkxldCB1cyByZWNyZWF0ZSBvbmUgb2YgdGhlIHBsb3RzIHN0dWRpZWQgYmVmb3JlOgoKYGBge3J9Cm15X2ZpZmFfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpZmExMCkgKyAKICBnZW9tX3BvaW50KGFlcyh4ID0gVGltZSwgeSA9IFBhc3NlcywgY29sb3IgPSBQb3NpdGlvbiwgc2l6ZSA9IFNob3RzKSwgCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkKYGBgCgoKVXNpbmcgdGhlIGBnZ3Bsb3RseSgpYCBmdW5jdGlvbiwgd2UgY2FuIGFkZCBpbnRlcmFjdGl2aXR5IHBvd2VyZWQgYnkgW3Bsb3RseV0oaHR0cHM6Ly9wbG90Lmx5LykKCmBgYHtyfQpnZ3Bsb3RseShteV9maWZhX3Bsb3QpCmBgYAoKTm90aWNlIHRoYXQgdGhlIGludGVyYWN0aXZlIHBsb3QgaXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIGAuaHRtbGAgb3V0cHV0IGdlbmVyYXRlZCBmcm9tIHRoaXMgbm90ZWJvb2shCgpUbyBnZXQgeW91IHN0YXJ0ZWQsIG90aGVyIGV4YW1wbGVzIGNhbiBiZSBmb3VuZCBiZWxvdzoKPGh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vaW50ZXJhY3RpdmUtY2hhcnRzLmh0bWw+Cgo=